package com.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DFSOutputStream;
import org.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

//Java操作HDFS
//文件上传、文件下载、文件删除
public class HdfsOp {
    public static void main(String[] args) throws IOException {
        //1.创建一个配置对象指定HDFS对应的地址
        Configuration configuration=new Configuration();
        configuration.set("fs.defaultFS","hdfs://bigdata01:9000");
        //2.根据配置信息获取操作HDFS的对象
        FileSystem fileSystem=FileSystem.get(configuration);
        //3.文件上传
        put(fileSystem);
        //4.文件下载
        get(fileSystem);
        //4.文件删除(也可以删除目录)
        delete(fileSystem);
    }
    //文件（目录）删除
    private static void delete(FileSystem fileSystem) throws IOException {
        //如果想要删除目录，第二个参数必须为true，如果删除的是文件或者和是一个空目录可以忽略
        boolean result = fileSystem.delete(new Path("/testone.txt"),true);
        if (result)
            System.out.println("删除成功");
        else
            System.out.println("删除失败");
    }

    //文件下载
    private static void get(FileSystem fileSystem) throws IOException {
        //4.1:通过open方法获取hdfs的文件输入流--指定要下载的文件路径
        FSDataInputStream inputStream= fileSystem.open(new Path("/README.txt"));
        //4.2：创建本地文件输出流--指定要保存的路径
        FileOutputStream outputStream=new FileOutputStream("D:\\README.txt");
        //4.3：通过工具类将输入流的数据拷贝到输出流中，指定缓冲区的容量的1024，使用完之后关闭流（第四个参数）--进行文件下载
        IOUtils.copyBytes(inputStream,outputStream,1024,true);
    }

    //文件上传
    private static void put(FileSystem fileSystem) throws IOException {
        //3.1：获取本地的文件输入流，指定要上传的文件路径
        FileInputStream fileInputStream=new FileInputStream("D:\\test.txt");
        //3.2：获取HDFS文件系统的数据输出流指定要上传到的路径
        FSDataOutputStream outputStream= fileSystem.create(new Path("/testone.txt"));
        //3.3：文件上传  通过工具类将输入流的数据拷贝到输出流中，指定缓冲区的容量的1024，使用完之后关闭流（第四个参数）
        IOUtils.copyBytes(fileInputStream,outputStream,1024,true);
    }
}
